const { z } = require('zod');

const baseMetadataSchema = z.object({
  tags: z.array(z.string()).optional(),
  source: z.string().optional(),
  description: z.string().optional()
}).passthrough();

const vectorSchema = z.array(z.number()).min(4, 'Vector length must be >= 4');

const createDocumentSchema = z.object({
  id: z.string().uuid().optional(),
  title: z.string().min(1).max(256),
  content: z.string().min(1),
  metadata: baseMetadataSchema.optional(),
  vector: vectorSchema.optional(),
  autoEmbed: z.boolean().optional()
});

const updateDocumentSchema = z.object({
  title: z.string().min(1).max(256).optional(),
  content: z.string().min(1).optional(),
  metadata: baseMetadataSchema.optional(),
  vector: vectorSchema.optional(),
  autoEmbed: z.boolean().optional()
});

const updateVectorSchema = z.object({
  vector: vectorSchema
});

const listDocumentsQuerySchema = z.object({
  limit: z.coerce.number().int().positive().max(200).default(50),
  offset: z.coerce.number().int().nonnegative().default(0)
});

const searchDocumentsQuerySchema = z.object({
  q: z.string().min(1).max(1024),
  limit: z.coerce.number().int().positive().max(50).default(20),
  tags: z
    .union([
      z.array(z.string()),
      z.string().transform((value) => value.split(',').map((item) => item.trim()).filter(Boolean))
    ])
    .optional()
    .transform((value) => value || [])
});

const searchDocumentsVectorSchema = z.object({
  vector: vectorSchema,
  limit: z.coerce.number().int().positive().max(50).default(20)
});

module.exports = {
  createDocumentSchema,
  updateDocumentSchema,
  listDocumentsQuerySchema,
  searchDocumentsQuerySchema,
  searchDocumentsVectorSchema,
  updateVectorSchema
};
